<?php
/**
* <h2>集合类</h2>
*
* <p>集合的特性就是元素的惟一性，<strong>CSET</strong>类是一个对集合特性的数据结构的实现</p>
*/
class CSET implements IDataType, Iterator {
	
	/**
	 * <h2>内部存储数组</h2>
	 * <p>保存集合的元素的数组</p>
	 *
	 * @var array
	 */
	private $_data;
	
	/**
	 * <h2>迭代指示器</h2>
	 * <p>用来标识迭代时元素的位置，通过调用rewind()重置</p>
	 *
	 * @var integer
	 */
	private $_position;
	
	/**
	 * <h2>构造函数</h2>
	 *
	 * <p>初始化内部数据，如开辟存储空间，设置迭代指示器等</p>
	 */
	public function __construct() {
		$this->_data = array ();
		$this->_position = 0;
	}
	
	/**
	 * <h2>添加元素</h2>
	 *
	 * <p>给集合中增加一个元素。如果要增加的元素已经在集合中存在，则不做任何操作，否则将该元素保存到集合中<p>
	 * <p><strong>Warning：&nbsp;</strong>CSET类的对象在迭代期间调用该方法，会产生不确定的后果</p>
	 *
	 * @param mixed $e
	 *        	要在集合中保存的元素
	 * @return void
	 */
	public function add($e) {
		if (! in_array ( $e, $this->_data, true )) {
			$this->_data [] = $e;
		}
	}
	
	/**
	 * <h2>删除元素 </h2>
	 *
	 * <p>从集合中删除一个元素。如果元素不存在，则不做任何操作，否则删除该元素。</p>
	 * <p><strong>Warning：&nbsp;</strong>CSET类的对象在迭代期间调用该方法，会产生不确定的后果</p>
	 *
	 * @param mixed $e
	 *        	要删除的元素
	 * @return void
	 */
	public function remove($e) {
		$idx = array_search ( $e, $this->_data, true );
		if (false !== $idx) {
			unset ( $this->_data [$idx] );
		}
	}
	
	/**
	 * <h2>计算集合元素的数量</h2>
	 *
	 * <p>该方法返回集合中拥有的远的数量，若集合为空，则返回0</p>
	 *
	 * @return integer
	 */
	public function size() {
		return count ( $this->_data );
	}
	
	/**
	 * <h2>获取当前迭代的元素</h2>
	 *
	 * <p>实现迭代器接口的方法，返回迭代器内部指针当前指向的元素</p>
	 *
	 * @see Iterator::current()
	 */
	public function current() {
		return $this->_data [$htis->_position];
	}
	
	/**
	 * <h2>放回当前迭代器的内部指针</h2>
	 *
	 * <p>实现迭代器的接口方法</p>
	 *
	 * @see Iterator::key()
	 */
	public function key() {
		return $this->_position;
	}
	
	/**
	 * <h2>迭代器的内部指针指向下一个元素</h2>
	 *
	 * <p>实现Iterator的接口方法</p>
	 *
	 * @see Iterator::next()
	 */
	public function next() {
		++ $this->_position;
	}
	
	/**
	 * <h2>重置迭代器的内部指针<h2>
	 *
	 * <p>实现迭代器的接口方法</p>
	 *
	 * @see Iterator::rewind()
	 */
	public function rewind() {
		$this->_position = 0;
	}
	
	/**
	 * <h2>判断当前迭代器内部指针指向的元素是否可用</h2>
	 *
	 * <p>实现迭代器的接口方法</p>
	 * 
	 * @see Iterator::valid()
	 */
	public function valid() {
		return isset ( $this->_data [$this->_position] );
	}
}